﻿/*****************************************************************//**
 *
 * @file   InpKeyLineSpliter.h
 * @brief  INP关键字分割，处理所有支持的关键字
 * @author fulipeng (flipengqd@yeah.net)
 * @date   2024-03-15
 *
 *********************************************************************/
#ifndef __CCXSTRINGDATASPLITTING_H
#define __CCXSTRINGDATASPLITTING_H

#include <QStringList>
#include <QHash>
#include <QString>

#define GeneratedStr "generated"
#define InternalStr  "internal"



namespace IO
{
    class FITKCalculiXINPReader;

    /**
     * @brief INP关键字分割
     * @author fulipeng (fulipengqd@yeah.net)
     * @date 2024-03-15
     */
    class InpKeyLineSpliter
    {
    public:
        /**
         * @brief 构造函数
         * @param line 数据行
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        explicit InpKeyLineSpliter(const QString& line, FITKCalculiXINPReader* readerInp);
        virtual ~InpKeyLineSpliter() = default;

        /**
         * @brief 获取头
         * @return 字符串头
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        QString getHeader();

        /**
         * @brief 获取行数据的key个数
         * @return key个数
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        int count();

        /**
         * @brief 获取第index个key
         * @param index 索引
         * @return key
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        QString getKeyIndex(int index);
        /**
         * @brief 运算符重载 输入key 返回对应的value
         * @param key key
         * @return 对应的value
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        QString operator[](const QString& key);
        /**
         * @brief  关键字是否有值
         * @param[i]  key         关键字
         * @return true
         * @return false
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-16
         */
        bool hasValue(const QString& key);
        /**
         * @brief 是否包含该关键字
         * @param[i]  key           关键字
         * @return true
         * @return false
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-16
         */
        bool hasKey(const QString& key);
        /**
         * @brief 通过字符串重置
         * @param[i]  aline          重置字符串
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-16
         */
        void reset(const QString& aline);

    private:
        /**
         * @brief 初始化处理数据
         * @param line 字符串
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        void initProcessed(QString line);

    private:
        /**
         * @brief 一行数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        QString _line{};
        /**
         * @brief 头字符
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        QString _header{};
        /**
         * @brief 关键字列表
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-16
         */
        QStringList _keys{};
        /**
         * @brief 关键字对应的值
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-16
         */
        QHash<QString,QString> _keyValues;
        /**
         * @brief 文件解析器
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        FITKCalculiXINPReader* _reader{};
    };
}

#endif // STRINGDATASPLITTING_H
